home *** CD-ROM | disk | FTP | other *** search
- ##
- ## vbcc-PowerPC libvc.a
- ##
- ## void *memcpy(void *s1,const void *s2,size_t n)
- ## r3 r3 r4 r5
- ##
- ## v0.2 23.12.97 phx
- ## check n=0
- ## v0.1 23.11.97 phx
- ##
-
- .set BYTECPY,16 # do byte-copy for n < 16
-
- .text
- .global memcpy
- memcpy:
- cmpwi r5,0
- beqlr
- mr r6,r3
- cmplwi r5,BYTECPY
- blt .bytecpy
- extrwi r7,r6,2,30
- extrwi. r8,r4,2,30
- cmpw cr1,r7,r8 # same alignment?
- bne cr1,.1
- beq .1 # 32-bit alignment
- li r7,4
- sub r7,r7,r8
- lwz r0,0(r4)
- sub r5,r5,r7
- add r4,r4,r7
- stw r0,0(r6) # store first bytes unaligned
- add r6,r6,r7
- .1: srwi r7,r5,2
- mtctr r7
- subi r4,r4,4
- subi r6,r6,4
- .2: lwzu r0,4(r4) # word-copy
- stwu r0,4(r6)
- bdnz .2
- andi. r5,r5,3 # remaining bytes?
- beqlr
- addi r4,r4,4
- addi r6,r6,4
- .bytecpy:
- mtctr r5
- subi r6,r6,1
- subi r4,r4,1
- .3: lbzu r0,1(r4)
- stbu r0,1(r6)
- bdnz .3
- blr
-
- .type memcpy,@function
- .size memcpy,$-memcpy
-